<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Flow: error/error.hpp File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr id="projectrow">
  <td id="projectalign">
   <div id="projectname">Flow<span id="projectnumber">&#160;2.0.0</span>
   </div>
   <div id="projectbrief">Flow project: Full implementation reference.</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="dir_4c52cb8b55b918be67d078d7a231760a.html">error</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="summary">
<a href="#nested-classes">Classes</a> &#124;
<a href="#namespaces">Namespaces</a> &#124;
<a href="#define-members">Macros</a> &#124;
<a href="#func-members">Functions</a>  </div>
  <div class="headertitle"><div class="title">error.hpp File Reference</div></div>
</div><!--header-->
<div class="contents">
<div class="textblock"><code>#include &quot;<a class="el" href="error__fwd_8hpp_source.html">flow/error/error_fwd.hpp</a>&quot;</code><br />
<code>#include &quot;<a class="el" href="log_8hpp_source.html">flow/log/log.hpp</a>&quot;</code><br />
<code>#include &quot;<a class="el" href="util_2detail_2util_8hpp_source.html">flow/util/detail/util.hpp</a>&quot;</code><br />
<code>#include &lt;boost/system/system_error.hpp&gt;</code><br />
<code>#include &lt;stdexcept&gt;</code><br />
</div>
<p><a href="error_2error_8hpp_source.html">Go to the source code of this file.</a></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
Classes</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1error_1_1Runtime__error.html">flow::error::Runtime_error</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">An <code>std::runtime_error</code> (which is an <code>std::exception</code>) that stores an <a class="el" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09" title="Short-hand for a boost.system error code (which basically encapsulates an integer/enum error code and...">Error_code</a>.  <a href="classflow_1_1error_1_1Runtime__error.html#details">More...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="namespaces" name="namespaces"></a>
Namespaces</h2></td></tr>
<tr class="memitem:namespaceflow"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceflow.html">flow</a></td></tr>
<tr class="memdesc:namespaceflow"><td class="mdescLeft">&#160;</td><td class="mdescRight">Catch-all namespace for the Flow project: A collection of various production-quality modules written in modern C++17, originally by ygoldfel. <br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:namespaceflow_1_1error"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceflow_1_1error.html">flow::error</a></td></tr>
<tr class="memdesc:namespaceflow_1_1error"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flow module that facilitates working with error codes and exceptions; essentially comprised of niceties on top <a class="el" href="namespaceboost_1_1system.html" title="We may add some ADL-based overloads into this namespace outside flow.">boost.system</a>'s error facility. <br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="define-members" name="define-members"></a>
Macros</h2></td></tr>
<tr class="memitem:ab6b8ed79012c994cfc381e0b92c066fd"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="error_2error_8hpp.html#ab6b8ed79012c994cfc381e0b92c066fd">FLOW_ERROR_EMIT_ERROR</a>(ARG_val)</td></tr>
<tr class="memdesc:ab6b8ed79012c994cfc381e0b92c066fd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets <code>*err_code</code> to <code>ARG_val</code> and logs a warning about the error using <a class="el" href="log_8hpp.html#a626c7dc4d3b4dc0b32a8aac8624d66bc" title="Logs a WARNING message into flow::log::Logger *get_logger() with flow::log::Component get_log_compone...">FLOW_LOG_WARNING()</a>.  <a href="error_2error_8hpp.html#ab6b8ed79012c994cfc381e0b92c066fd">More...</a><br /></td></tr>
<tr class="separator:ab6b8ed79012c994cfc381e0b92c066fd"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:adc17094d4b9421abd04b90caab8b8e72"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="error_2error_8hpp.html#adc17094d4b9421abd04b90caab8b8e72">FLOW_ERROR_EMIT_ERROR_LOG_INFO</a>(ARG_val)</td></tr>
<tr class="memdesc:adc17094d4b9421abd04b90caab8b8e72"><td class="mdescLeft">&#160;</td><td class="mdescRight">Identical to <a class="el" href="error_2error_8hpp.html#ab6b8ed79012c994cfc381e0b92c066fd" title="Sets *err_code to ARG_val and logs a warning about the error using FLOW_LOG_WARNING().">FLOW_ERROR_EMIT_ERROR()</a>, but the message logged has <a class="el" href="namespaceflow_1_1log.html#a5c602384e6fe9d7642740ac2fae4ad04ac238793326fae17afcc849e96b96e8e7" title="Message indicates a not-&quot;bad&quot; condition that is not frequent enough to be of severity Sev::S_TRACE.">flow::log::Sev::S_INFO</a> severity instead of <code>S_WARNING</code>.  <a href="error_2error_8hpp.html#adc17094d4b9421abd04b90caab8b8e72">More...</a><br /></td></tr>
<tr class="separator:adc17094d4b9421abd04b90caab8b8e72"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5d44fa375b0080a95f45f664c0407c72"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="error_2error_8hpp.html#a5d44fa375b0080a95f45f664c0407c72">FLOW_ERROR_LOG_ERROR</a>(ARG_val)</td></tr>
<tr class="memdesc:a5d44fa375b0080a95f45f664c0407c72"><td class="mdescLeft">&#160;</td><td class="mdescRight">Logs a warning about the given error code using <a class="el" href="log_8hpp.html#a626c7dc4d3b4dc0b32a8aac8624d66bc" title="Logs a WARNING message into flow::log::Logger *get_logger() with flow::log::Component get_log_compone...">FLOW_LOG_WARNING()</a>.  <a href="error_2error_8hpp.html#a5d44fa375b0080a95f45f664c0407c72">More...</a><br /></td></tr>
<tr class="separator:a5d44fa375b0080a95f45f664c0407c72"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a019ee6e90802e444572dd78d312d6e23"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="error_2error_8hpp.html#a019ee6e90802e444572dd78d312d6e23">FLOW_ERROR_SYS_ERROR_LOG_WARNING</a>()&#160;&#160;&#160;  <a class="el" href="log_8hpp.html#a626c7dc4d3b4dc0b32a8aac8624d66bc">FLOW_LOG_WARNING</a>(&quot;System error occurred: [&quot; &lt;&lt; sys_err_code &lt;&lt; &quot;] [&quot; &lt;&lt; sys_err_code.message() &lt;&lt; &quot;].&quot;)</td></tr>
<tr class="memdesc:a019ee6e90802e444572dd78d312d6e23"><td class="mdescLeft">&#160;</td><td class="mdescRight">Logs a warning about the (often <code>errno</code>-based or from a library) error code in <code>sys_err_code</code>.  <a href="error_2error_8hpp.html#a019ee6e90802e444572dd78d312d6e23">More...</a><br /></td></tr>
<tr class="separator:a019ee6e90802e444572dd78d312d6e23"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a718bccd9aa8110891f8b615efd42ff65"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="error_2error_8hpp.html#a718bccd9aa8110891f8b615efd42ff65">FLOW_ERROR_SYS_ERROR_LOG_FATAL</a>()&#160;&#160;&#160;  <a class="el" href="log_8hpp.html#a86c9eda3c93618933d751b675bdbefa5">FLOW_LOG_FATAL</a>(&quot;System error occurred: [&quot; &lt;&lt; sys_err_code &lt;&lt; &quot;] [&quot; &lt;&lt; sys_err_code.message() &lt;&lt; &quot;].&quot;)</td></tr>
<tr class="memdesc:a718bccd9aa8110891f8b615efd42ff65"><td class="mdescLeft">&#160;</td><td class="mdescRight">Logs a log::Sev::S_FATAL message about the (often <code>errno</code>-based or from a library) error code in <code>sys_err_code</code>, usually just before aborting the process or otherwise entering undefined-behavior land such as via <code>assert(false)</code>.  <a href="error_2error_8hpp.html#a718bccd9aa8110891f8b615efd42ff65">More...</a><br /></td></tr>
<tr class="separator:a718bccd9aa8110891f8b615efd42ff65"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a636b2d30a8785df6e84646b568bce9b5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="error_2error_8hpp.html#a636b2d30a8785df6e84646b568bce9b5">FLOW_ERROR_EXEC_AND_THROW_ON_ERROR</a>(ARG_ret_type,  ARG_function_name, ...)</td></tr>
<tr class="memdesc:a636b2d30a8785df6e84646b568bce9b5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Narrow-use macro that implements the error code/exception semantics expected of most public-facing Flow (and Flow-like) class method APIs.  <a href="error_2error_8hpp.html#a636b2d30a8785df6e84646b568bce9b5">More...</a><br /></td></tr>
<tr class="separator:a636b2d30a8785df6e84646b568bce9b5"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
Functions</h2></td></tr>
<tr class="memitem:aa3708bdd4ceb1a6c801f3d4a1fc10f6d"><td class="memTemplParams" colspan="2">template&lt;typename Func , typename Ret &gt; </td></tr>
<tr class="memitem:aa3708bdd4ceb1a6c801f3d4a1fc10f6d"><td class="memTemplItemLeft" align="right" valign="top"><a class="el" href="classbool.html">bool</a>&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="namespaceflow_1_1error.html#aa3708bdd4ceb1a6c801f3d4a1fc10f6d">flow::error::exec_and_throw_on_error</a> (const Func &amp;func, Ret *ret, Error_code *err_code, util::String_view context)</td></tr>
<tr class="memdesc:aa3708bdd4ceb1a6c801f3d4a1fc10f6d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Helper for <a class="el" href="error_2error_8hpp.html#a636b2d30a8785df6e84646b568bce9b5" title="Narrow-use macro that implements the error code/exception semantics expected of most public-facing Fl...">FLOW_ERROR_EXEC_AND_THROW_ON_ERROR()</a> macro that does everything in the latter not needing a preprocessor.  <a href="namespaceflow_1_1error.html#aa3708bdd4ceb1a6c801f3d4a1fc10f6d">More...</a><br /></td></tr>
<tr class="separator:aa3708bdd4ceb1a6c801f3d4a1fc10f6d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a48afa7f8c2e100acd461365dfb00a114"><td class="memTemplParams" colspan="2">template&lt;typename Func &gt; </td></tr>
<tr class="memitem:a48afa7f8c2e100acd461365dfb00a114"><td class="memTemplItemLeft" align="right" valign="top"><a class="el" href="classbool.html">bool</a>&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="namespaceflow_1_1error.html#a48afa7f8c2e100acd461365dfb00a114">flow::error::exec_void_and_throw_on_error</a> (const Func &amp;func, Error_code *err_code, util::String_view context)</td></tr>
<tr class="memdesc:a48afa7f8c2e100acd461365dfb00a114"><td class="mdescLeft">&#160;</td><td class="mdescRight">Equivalent of <a class="el" href="namespaceflow_1_1error.html#aa3708bdd4ceb1a6c801f3d4a1fc10f6d" title="Helper for FLOW_ERROR_EXEC_AND_THROW_ON_ERROR() macro that does everything in the latter not needing ...">exec_and_throw_on_error()</a> for operations with <code>void</code> return type.  <a href="namespaceflow_1_1error.html#a48afa7f8c2e100acd461365dfb00a114">More...</a><br /></td></tr>
<tr class="separator:a48afa7f8c2e100acd461365dfb00a114"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<h2 class="groupheader">Macro Definition Documentation</h2>
<a id="ab6b8ed79012c994cfc381e0b92c066fd" name="ab6b8ed79012c994cfc381e0b92c066fd"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab6b8ed79012c994cfc381e0b92c066fd">&#9670;&nbsp;</a></span>FLOW_ERROR_EMIT_ERROR</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define FLOW_ERROR_EMIT_ERROR</td>
          <td>(</td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">ARG_val</td><td>)</td>
          <td></td>
        </tr>
      </table>
</div><div class="memdoc">
<b>Value:</b><div class="fragment"><div class="line">  <a class="code hl_define" href="util__fwd_8hpp.html#a402a1fb61d3fe4ca6767729e38620d6d">FLOW_UTIL_SEMICOLON_SAFE</a> \</div>
<div class="line">  ( \</div>
<div class="line">    <a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">::flow::Error_code</a> FLOW_ERROR_EMIT_ERR_val(ARG_val); \</div>
<div class="line">    FLOW_LOG_WARNING(<span class="stringliteral">&quot;Error code emitted: [&quot;</span> &lt;&lt; FLOW_ERROR_EMIT_ERR_val &lt;&lt; <span class="stringliteral">&quot;] &quot;</span> \</div>
<div class="line">                     <span class="stringliteral">&quot;[&quot;</span> &lt;&lt; FLOW_ERROR_EMIT_ERR_val.message() &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>); \</div>
<div class="line">    *err_code = FLOW_ERROR_EMIT_ERR_val; \</div>
<div class="line">  )</div>
<div class="ttc" id="anamespaceflow_html_a29eaaa9d0fac4ce87d8b969222dbed09"><div class="ttname"><a href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">flow::Error_code</a></div><div class="ttdeci">boost::system::error_code Error_code</div><div class="ttdoc">Short-hand for a boost.system error code (which basically encapsulates an integer/enum error code and...</div><div class="ttdef"><b>Definition:</b> <a href="common_8hpp_source.html#l00508">common.hpp:508</a></div></div>
<div class="ttc" id="autil__fwd_8hpp_html_a402a1fb61d3fe4ca6767729e38620d6d"><div class="ttname"><a href="util__fwd_8hpp.html#a402a1fb61d3fe4ca6767729e38620d6d">FLOW_UTIL_SEMICOLON_SAFE</a></div><div class="ttdeci">#define FLOW_UTIL_SEMICOLON_SAFE(ARG_func_macro_definition)</div><div class="ttdoc">Use this to create a semicolon-safe version of a &quot;void&quot; functional macro definition consisting of at ...</div><div class="ttdef"><b>Definition:</b> <a href="util__fwd_8hpp_source.html#l01079">util_fwd.hpp:1079</a></div></div>
</div><!-- fragment -->
<p>Sets <code>*err_code</code> to <code>ARG_val</code> and logs a warning about the error using <a class="el" href="log_8hpp.html#a626c7dc4d3b4dc0b32a8aac8624d66bc" title="Logs a WARNING message into flow::log::Logger *get_logger() with flow::log::Component get_log_compone...">FLOW_LOG_WARNING()</a>. </p>
<p >An <code>err_code</code> variable of type that is pointer to <a class="el" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09" title="Short-hand for a boost.system error code (which basically encapsulates an integer/enum error code and...">flow::Error_code</a> must be declared at the point where the macro is invoked.</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">ARG_val</td><td>Value convertible to <a class="el" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09" title="Short-hand for a boost.system error code (which basically encapsulates an integer/enum error code and...">flow::Error_code</a>. Reminder: <code>Error_code</code> is trivially/implicitly convertible from any error code set (such as <code>errno</code>s and boost.asio network error code set) that has been <a class="el" href="namespaceboost_1_1system.html" title="We may add some ADL-based overloads into this namespace outside flow.">boost.system</a>-enabled. </td></tr>
  </table>
  </dd>
</dl>

<p class="definition">Definition at line <a class="el" href="error_2error_8hpp_source.html#l00202">202</a> of file <a class="el" href="error_2error_8hpp_source.html">error.hpp</a>.</p>

</div>
</div>
<a id="adc17094d4b9421abd04b90caab8b8e72" name="adc17094d4b9421abd04b90caab8b8e72"></a>
<h2 class="memtitle"><span class="permalink"><a href="#adc17094d4b9421abd04b90caab8b8e72">&#9670;&nbsp;</a></span>FLOW_ERROR_EMIT_ERROR_LOG_INFO</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define FLOW_ERROR_EMIT_ERROR_LOG_INFO</td>
          <td>(</td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">ARG_val</td><td>)</td>
          <td></td>
        </tr>
      </table>
</div><div class="memdoc">
<b>Value:</b><div class="fragment"><div class="line">  <a class="code hl_define" href="util__fwd_8hpp.html#a402a1fb61d3fe4ca6767729e38620d6d">FLOW_UTIL_SEMICOLON_SAFE</a> \</div>
<div class="line">  ( \</div>
<div class="line">    <a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">::flow::Error_code</a> FLOW_ERROR_EMIT_ERR_LOG_val(ARG_val); \</div>
<div class="line">    FLOW_LOG_INFO(<span class="stringliteral">&quot;Error code emitted: [&quot;</span> &lt;&lt; FLOW_ERROR_EMIT_ERR_LOG_val &lt;&lt; <span class="stringliteral">&quot;] &quot;</span> \</div>
<div class="line">                  <span class="stringliteral">&quot;[&quot;</span> &lt;&lt; FLOW_ERROR_EMIT_ERR_LOG_val.message() &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>); \</div>
<div class="line">    *err_code = FLOW_ERROR_EMIT_ERR_LOG_val; \</div>
<div class="line">  )</div>
</div><!-- fragment -->
<p>Identical to <a class="el" href="error_2error_8hpp.html#ab6b8ed79012c994cfc381e0b92c066fd" title="Sets *err_code to ARG_val and logs a warning about the error using FLOW_LOG_WARNING().">FLOW_ERROR_EMIT_ERROR()</a>, but the message logged has <a class="el" href="namespaceflow_1_1log.html#a5c602384e6fe9d7642740ac2fae4ad04ac238793326fae17afcc849e96b96e8e7" title="Message indicates a not-&quot;bad&quot; condition that is not frequent enough to be of severity Sev::S_TRACE.">flow::log::Sev::S_INFO</a> severity instead of <code>S_WARNING</code>. </p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">ARG_val</td><td>See <a class="el" href="error_2error_8hpp.html#ab6b8ed79012c994cfc381e0b92c066fd" title="Sets *err_code to ARG_val and logs a warning about the error using FLOW_LOG_WARNING().">FLOW_ERROR_EMIT_ERROR()</a>. </td></tr>
  </table>
  </dd>
</dl>

<p class="definition">Definition at line <a class="el" href="error_2error_8hpp_source.html#l00218">218</a> of file <a class="el" href="error_2error_8hpp_source.html">error.hpp</a>.</p>

</div>
</div>
<a id="a636b2d30a8785df6e84646b568bce9b5" name="a636b2d30a8785df6e84646b568bce9b5"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a636b2d30a8785df6e84646b568bce9b5">&#9670;&nbsp;</a></span>FLOW_ERROR_EXEC_AND_THROW_ON_ERROR</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define FLOW_ERROR_EXEC_AND_THROW_ON_ERROR</td>
          <td>(</td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">ARG_ret_type, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">ARG_function_name, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">&#160;</td>
          <td class="paramname"><em>...</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">
<b>Value:</b><div class="fragment"><div class="line">  <a class="code hl_define" href="util__fwd_8hpp.html#a402a1fb61d3fe4ca6767729e38620d6d">FLOW_UTIL_SEMICOLON_SAFE</a> \</div>
<div class="line">  ( \</div>
<div class="line">    <span class="comment">/* We need both the result of the operation (if applicable) and whether it actually ran. */</span> \</div>
<div class="line">    <span class="comment">/* So we must introduce this local variable (note it&#39;s within a { block } so should minimally interfere with */</span> \</div>
<div class="line">    <span class="comment">/* the invoker&#39;s code).  We can&#39;t use a sentinel value to combine the two, since the operation&#39;s result may */</span> \</div>
<div class="line">    <span class="comment">/* require ARG_ret_type&#39;s entire range. */</span> \</div>
<div class="line">    ARG_ret_type result; \</div>
<div class="line">    <span class="comment">/* We provide the function: f(Error_code*), where f(e_c) == ARG_function_name(..., e_c, ...). */</span> \</div>
<div class="line">    <span class="comment">/* Also supply context info of this macro&#39;s invocation spot. */</span> \</div>
<div class="line">    <span class="comment">/* Note that, if f() is executed, it may throw Runtime_error which is the point of its existence. */</span> \</div>
<div class="line">    if (<a class="code hl_function" href="namespaceflow_1_1error.html#aa3708bdd4ceb1a6c801f3d4a1fc10f6d">::flow::error::exec_and_throw_on_error</a> \</div>
<div class="line">          ([&amp;](<a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">::flow::Error_code</a>* _1) -&gt; ARG_ret_type \</div>
<div class="line">             { <span class="keywordflow">return</span> ARG_function_name(__VA_ARGS__); }, \</div>
<div class="line">           &amp;result, err_code, <a class="code hl_define" href="util_2detail_2util_8hpp.html#a03c693936e039ffd16a3511050496a66">FLOW_UTIL_WHERE_AM_I_LITERAL</a>(ARG_function_name))) \</div>
<div class="line">    { \</div>
<div class="line">      <span class="comment">/* Aforementioned f() WAS executed; did NOT throw (no error); and return value was placed into `result`. */</span> \</div>
<div class="line">      return result; \</div>
<div class="line">    } \</div>
<div class="line">    <span class="comment">/* else: */</span> \</div>
<div class="line">    <span class="comment">/* f() did not run, because err_code is non-null.  So now macro invoker should do its thing assuming that fact. */</span> \</div>
<div class="line">    <span class="comment">/* Recall that the idea is that f() is just recursively calling the method invoking this macro with the same */</span> \</div>
<div class="line">    <span class="comment">/* arguments except for the Error_code* arg, where they supply specifically `_1` by our contract. */</span> \</div>
<div class="line">  )</div>
<div class="ttc" id="anamespaceflow_1_1error_html_aa3708bdd4ceb1a6c801f3d4a1fc10f6d"><div class="ttname"><a href="namespaceflow_1_1error.html#aa3708bdd4ceb1a6c801f3d4a1fc10f6d">flow::error::exec_and_throw_on_error</a></div><div class="ttdeci">bool exec_and_throw_on_error(const Func &amp;func, Ret *ret, Error_code *err_code, util::String_view context)</div><div class="ttdoc">Helper for FLOW_ERROR_EXEC_AND_THROW_ON_ERROR() macro that does everything in the latter not needing ...</div><div class="ttdef"><b>Definition:</b> <a href="error_2error_8hpp_source.html#l00128">error.hpp:128</a></div></div>
<div class="ttc" id="autil_2detail_2util_8hpp_html_a03c693936e039ffd16a3511050496a66"><div class="ttname"><a href="util_2detail_2util_8hpp.html#a03c693936e039ffd16a3511050496a66">FLOW_UTIL_WHERE_AM_I_LITERAL</a></div><div class="ttdeci">#define FLOW_UTIL_WHERE_AM_I_LITERAL(ARG_function)</div><div class="ttdoc">Helper macro: like FLOW_UTIL_WHERE_AM_I(), with a major relative strength – its replacement is a stri...</div><div class="ttdef"><b>Definition:</b> <a href="util_2detail_2util_8hpp_source.html#l00169">util.hpp:169</a></div></div>
</div><!-- fragment -->
<p>Narrow-use macro that implements the error code/exception semantics expected of most public-facing Flow (and Flow-like) class method APIs. </p>
<p >The semantics it helps implement are explained in <a class="el" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09" title="Short-hand for a boost.system error code (which basically encapsulates an integer/enum error code and...">flow::Error_code</a> doc header. More formally, here is how to use it:</p>
<p >First, please read <a class="el" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09" title="Short-hand for a boost.system error code (which basically encapsulates an integer/enum error code and...">flow::Error_code</a> doc header. Next read on:</p>
<p >Suppose you have an API <code>f()</code> in some class <code>C</code> that returns type <code>T</code> and promises, in its doc header, to implement the error reporting semantics listed in the aforementioned <a class="el" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09" title="Short-hand for a boost.system error code (which basically encapsulates an integer/enum error code and...">flow::Error_code</a> doc header. That is, if user passes in null <code>err_code</code>, error would cause <code>Run_time error(e_c)</code> to be thrown; if non-null, then <code>*err_code = e_c</code> would be set sans exception &ndash; <code>e_c</code> being the error code explaining what went wrong, such as <a class="el" href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482ab92ec3b2b78d74acf0fda0786f601df5" title="A blocking (sync_) or background-blocking (async_) operation was interrupted, such as by a signal.">flow::net_flow::error::Code::S_WAIT_INTERRUPTED</a>. Then here's how to use the macro:</p>
<div class="fragment"><div class="line"><span class="comment">// Example API.  In this one, there&#39;s a 4th argument that happens to follow the standard Error_code* one.</span></div>
<div class="line"><span class="comment">// arg2 is a (const) reference, as opposed to a pointer or scalar, and is most efficiently handled by adding</span></div>
<div class="line"><span class="comment">// cref() to avoid copying it.</span></div>
<div class="line">T f(AT1 arg1, <span class="keyword">const</span> AT2&amp; arg2, <a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>* err_code = 0, AT3 arg3 = 0)</div>
<div class="line">{</div>
<div class="line">  <a class="code hl_define" href="error_2error_8hpp.html#a636b2d30a8785df6e84646b568bce9b5">FLOW_ERROR_EXEC_AND_THROW_ON_ERROR</a>(T, <span class="comment">// Provide the return type of the API.</span></div>
<div class="line">                                        <span class="comment">// Forward all the args into the macro, but replace `err_code` =&gt; `_1`.</span></div>
<div class="line">                                     arg1, arg2, _1, arg3);</div>
<div class="line">  <span class="comment">// ^-- Call ourselves and return if err_code is null.  If got to present line, err_code is not null.</span></div>
<div class="line"> </div>
<div class="line">  <span class="comment">// ...Bulk of f() goes here!  You can now set *err_code to anything without fear....</span></div>
<div class="line">}</div>
<div class="ttc" id="aerror_2error_8hpp_html_a636b2d30a8785df6e84646b568bce9b5"><div class="ttname"><a href="error_2error_8hpp.html#a636b2d30a8785df6e84646b568bce9b5">FLOW_ERROR_EXEC_AND_THROW_ON_ERROR</a></div><div class="ttdeci">#define FLOW_ERROR_EXEC_AND_THROW_ON_ERROR(ARG_ret_type, ARG_function_name,...)</div><div class="ttdoc">Narrow-use macro that implements the error code/exception semantics expected of most public-facing Fl...</div><div class="ttdef"><b>Definition:</b> <a href="error_2error_8hpp_source.html#l00363">error.hpp:363</a></div></div>
</div><!-- fragment --><dl class="section see"><dt>See also</dt><dd><a class="el" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09" title="Short-hand for a boost.system error code (which basically encapsulates an integer/enum error code and...">flow::Error_code</a> for typical error reporting semantics this macro helps implement. </dd>
<dd>
<a class="el" href="namespaceflow_1_1error.html#a48afa7f8c2e100acd461365dfb00a114" title="Equivalent of exec_and_throw_on_error() for operations with void return type.">exec_void_and_throw_on_error()</a> which you can use directly when <code>ARG_ret_type</code> would be void. The present macro does not work in that case; but at that point using the function directly is concise enough. </dd>
<dd>
<a class="el" href="namespaceflow_1_1error.html#aa3708bdd4ceb1a6c801f3d4a1fc10f6d" title="Helper for FLOW_ERROR_EXEC_AND_THROW_ON_ERROR() macro that does everything in the latter not needing ...">exec_and_throw_on_error()</a> which you can use directly when <code>T</code> is a reference type. The present macro does not work in that case.</dd></dl>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">ARG_ret_type</td><td>The return type of the invoking function/method. It cannot be a reference type. In practice this would be, for example, <code>size_t</code> when wrapping a <code>receive()</code> (which returns # of bytes received or 0). </td></tr>
    <tr><td class="paramname">ARG_function_name</td><td>Suppose you wanted to, via infinite recursion, call the function &ndash; from where you use this macro &ndash; and would therefore write a statement of the form <code>return F(A1, A2, ..., err_code, ...);</code>. <code>ARG_function_name</code> shall be the <code>F</code> part of such a hypothetical statement. Tip: Even in non-<code>static</code> member functions (methods), just the method name &ndash; without the class name <code>::</code> part &ndash; is almost always fine. Tip: However template args typically do have to be forwarded (e.g., in <code>template&lt;typename T&gt; X::f() {}</code> you'd supply <code>f&lt;T&gt;</code> as <code>ARG_function_name</code>), unless the compiler can infer them. Example: in a <code>bool X::listen(int x, Error_code* err_code, float y) {}</code> you'd have <code>{ return listen(x, err_code, y); }</code> and thus <code>ARG_function_name</code> shall be just <code>listen</code>. Tip: But, if there are 2+ template args, and the compiler cannot infer them, you need to surround the <code>x&lt;a, b, ...&gt;</code> with parentheses: like: <code>FLOW_ERROR_EXEC_AND_THROW_ON_ERROR(int, (x&lt;a, b&gt;), ...)</code>. </td></tr>
    <tr><td class="paramname">...</td><td>First see the premise in the doc header for <code>ARG_function_name</code> just above. Then the <code>...</code> arg list shall be as follows: <code>A1, A2, ..., _1, ...</code>. In other words it shall be the arg list for the invoking function/method as-if recursively calling it, but with the <code>err_code</code> arg replaced by the special identifier <code>_1</code>. Example: in a <code>bool X::listen(int x, Error_code* err_code, float y) {}</code> you'd have <code>{ return listen(x, err_code, y); }</code> and thus <code>...</code> arg list shall be: <code>x, _1, y</code>. </td></tr>
  </table>
  </dd>
</dl>

<p class="definition">Definition at line <a class="el" href="error_2error_8hpp_source.html#l00363">363</a> of file <a class="el" href="error_2error_8hpp_source.html">error.hpp</a>.</p>

</div>
</div>
<a id="a5d44fa375b0080a95f45f664c0407c72" name="a5d44fa375b0080a95f45f664c0407c72"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5d44fa375b0080a95f45f664c0407c72">&#9670;&nbsp;</a></span>FLOW_ERROR_LOG_ERROR</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define FLOW_ERROR_LOG_ERROR</td>
          <td>(</td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">ARG_val</td><td>)</td>
          <td></td>
        </tr>
      </table>
</div><div class="memdoc">
<b>Value:</b><div class="fragment"><div class="line">  <a class="code hl_define" href="util__fwd_8hpp.html#a402a1fb61d3fe4ca6767729e38620d6d">FLOW_UTIL_SEMICOLON_SAFE</a> \</div>
<div class="line">  ( \</div>
<div class="line">    <a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">::flow::Error_code</a> FLOW_ERROR_LOG_ERR_val(ARG_val); \</div>
<div class="line">    FLOW_LOG_WARNING(<span class="stringliteral">&quot;Error occurred: [&quot;</span> &lt;&lt; FLOW_ERROR_LOG_ERR_val &lt;&lt; <span class="stringliteral">&quot;] &quot;</span> \</div>
<div class="line">                     <span class="stringliteral">&quot;[&quot;</span> &lt;&lt; FLOW_ERROR_LOG_ERR_val.message() &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>); \</div>
<div class="line">  )</div>
</div><!-- fragment -->
<p>Logs a warning about the given error code using <a class="el" href="log_8hpp.html#a626c7dc4d3b4dc0b32a8aac8624d66bc" title="Logs a WARNING message into flow::log::Logger *get_logger() with flow::log::Component get_log_compone...">FLOW_LOG_WARNING()</a>. </p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">ARG_val</td><td>See <a class="el" href="error_2error_8hpp.html#ab6b8ed79012c994cfc381e0b92c066fd" title="Sets *err_code to ARG_val and logs a warning about the error using FLOW_LOG_WARNING().">FLOW_ERROR_EMIT_ERROR()</a>. </td></tr>
  </table>
  </dd>
</dl>

<p class="definition">Definition at line <a class="el" href="error_2error_8hpp_source.html#l00233">233</a> of file <a class="el" href="error_2error_8hpp_source.html">error.hpp</a>.</p>

</div>
</div>
<a id="a718bccd9aa8110891f8b615efd42ff65" name="a718bccd9aa8110891f8b615efd42ff65"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a718bccd9aa8110891f8b615efd42ff65">&#9670;&nbsp;</a></span>FLOW_ERROR_SYS_ERROR_LOG_FATAL</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define FLOW_ERROR_SYS_ERROR_LOG_FATAL</td>
          <td>(</td>
          <td class="paramname"></td><td>)</td>
          <td>&#160;&#160;&#160;  <a class="el" href="log_8hpp.html#a86c9eda3c93618933d751b675bdbefa5">FLOW_LOG_FATAL</a>(&quot;System error occurred: [&quot; &lt;&lt; sys_err_code &lt;&lt; &quot;] [&quot; &lt;&lt; sys_err_code.message() &lt;&lt; &quot;].&quot;)</td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Logs a log::Sev::S_FATAL message about the (often <code>errno</code>-based or from a library) error code in <code>sys_err_code</code>, usually just before aborting the process or otherwise entering undefined-behavior land such as via <code>assert(false)</code>. </p>
<p ><code>sys_err_code</code> must be an object of type <a class="el" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09" title="Short-hand for a boost.system error code (which basically encapsulates an integer/enum error code and...">flow::Error_code</a> in the context of the macro's invocation.</p>
<p >This is identical to <a class="el" href="error_2error_8hpp.html#a019ee6e90802e444572dd78d312d6e23" title="Logs a warning about the (often errno-based or from a library) error code in sys_err_code.">FLOW_ERROR_SYS_ERROR_LOG_WARNING()</a>, except the message logged has FATAL severity instead of a mere WARNING. Notes in that macro's doc header generally apply. However the use case is different.</p>
<p >The recommended (but in no way enforced or mandatory) pattern is something like:</p>
<div class="fragment"><div class="line"><a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a> sys_err_code;</div>
<div class="line"> </div>
<div class="line"><span class="comment">// ...</span></div>
<div class="line"> </div>
<div class="line"><span class="comment">// sys_err_code has been set to truthy value that is completely unexpected or so unpalatable as to make</span></div>
<div class="line"><span class="comment">// any attempt at recovery not worth the effort.  Decision has therefore been made to abort and/or</span></div>
<div class="line"><span class="comment">// enter undefined-behavior land.</span></div>
<div class="line"> </div>
<div class="line"><a class="code hl_define" href="log_8hpp.html#a86c9eda3c93618933d751b675bdbefa5">FLOW_LOG_FATAL</a>(<span class="stringliteral">&quot;(...Explain what went wrong, and why it is very shocking; output values of interest; but not &quot;</span></div>
<div class="line">               <span class="stringliteral">&quot;`sys_err_code` since....)  Details follow.&quot;</span>);</div>
<div class="line"><a class="code hl_define" href="error_2error_8hpp.html#a718bccd9aa8110891f8b615efd42ff65">FLOW_ERROR_SYS_ERROR_LOG_FATAL</a>();</div>
<div class="line"> </div>
<div class="line"><span class="comment">// Enter undefined-behavior land.</span></div>
<div class="line"><span class="comment">// Different orgs/projects do different things; but a decent approach might be:</span></div>
<div class="line">assert(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;(...Re-explain what went wrong, so it shows up in the assert-trip message on some stderr.&quot;</span>);</div>
<div class="line"><span class="comment">// Possibly really abort program, even if assert()s are disabled via NDEBUG.</span></div>
<div class="line">std::abort();</div>
<div class="ttc" id="aerror_2error_8hpp_html_a718bccd9aa8110891f8b615efd42ff65"><div class="ttname"><a href="error_2error_8hpp.html#a718bccd9aa8110891f8b615efd42ff65">FLOW_ERROR_SYS_ERROR_LOG_FATAL</a></div><div class="ttdeci">#define FLOW_ERROR_SYS_ERROR_LOG_FATAL()</div><div class="ttdoc">Logs a log::Sev::S_FATAL message about the (often errno-based or from a library) error code in sys_er...</div><div class="ttdef"><b>Definition:</b> <a href="error_2error_8hpp_source.html#l00302">error.hpp:302</a></div></div>
<div class="ttc" id="alog_8hpp_html_a86c9eda3c93618933d751b675bdbefa5"><div class="ttname"><a href="log_8hpp.html#a86c9eda3c93618933d751b675bdbefa5">FLOW_LOG_FATAL</a></div><div class="ttdeci">#define FLOW_LOG_FATAL(ARG_stream_fragment)</div><div class="ttdoc">Logs a FATAL message into flow::log::Logger *get_logger() with flow::log::Component get_log_component...</div><div class="ttdef"><b>Definition:</b> <a href="log_8hpp_source.html#l00167">log.hpp:167</a></div></div>
</div><!-- fragment --> 
<p class="definition">Definition at line <a class="el" href="error_2error_8hpp_source.html#l00302">302</a> of file <a class="el" href="error_2error_8hpp_source.html">error.hpp</a>.</p>

</div>
</div>
<a id="a019ee6e90802e444572dd78d312d6e23" name="a019ee6e90802e444572dd78d312d6e23"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a019ee6e90802e444572dd78d312d6e23">&#9670;&nbsp;</a></span>FLOW_ERROR_SYS_ERROR_LOG_WARNING</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define FLOW_ERROR_SYS_ERROR_LOG_WARNING</td>
          <td>(</td>
          <td class="paramname"></td><td>)</td>
          <td>&#160;&#160;&#160;  <a class="el" href="log_8hpp.html#a626c7dc4d3b4dc0b32a8aac8624d66bc">FLOW_LOG_WARNING</a>(&quot;System error occurred: [&quot; &lt;&lt; sys_err_code &lt;&lt; &quot;] [&quot; &lt;&lt; sys_err_code.message() &lt;&lt; &quot;].&quot;)</td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Logs a warning about the (often <code>errno</code>-based or from a library) error code in <code>sys_err_code</code>. </p>
<p ><code>sys_err_code</code> must be an object of type <a class="el" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09" title="Short-hand for a boost.system error code (which basically encapsulates an integer/enum error code and...">flow::Error_code</a> in the context of the macro's invocation. See also <a class="el" href="error_2error_8hpp.html#a718bccd9aa8110891f8b615efd42ff65" title="Logs a log::Sev::S_FATAL message about the (often errno-based or from a library) error code in sys_er...">FLOW_ERROR_SYS_ERROR_LOG_FATAL()</a>.</p>
<p >Note this implies a convention wherein system (especially <code>errno</code>-based or from a libary) error codes are to be saved into a stack variable or parameter <code><a class="el" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09" title="Short-hand for a boost.system error code (which basically encapsulates an integer/enum error code and...">flow::Error_code</a> sys_err_code</code>. Of course if you don't like this convention and/or this error message, it is trivial to log something manually.</p>
<p >It's a functional macro despite taking no arguments to convey that it mimics a <code>void</code> free function.</p>
<p >The recommended (but in no way enforced or mandatory) pattern is something like:</p>
<div class="fragment"><div class="line"><a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a> sys_err_code;</div>
<div class="line"> </div>
<div class="line"><span class="comment">// ...</span></div>
<div class="line"> </div>
<div class="line"><span class="comment">// sys_err_code has been set to truthy value.  Decision has therefore been made to log about it but otherwise</span></div>
<div class="line"><span class="comment">// recover and continue algorithm.</span></div>
<div class="line"> </div>
<div class="line"><a class="code hl_define" href="log_8hpp.html#a626c7dc4d3b4dc0b32a8aac8624d66bc">FLOW_LOG_WARNING</a>(<span class="stringliteral">&quot;(...Explain what went wrong; output values of interest; but not `sys_err_code` since....)  &quot;</span></div>
<div class="line">                 <span class="stringliteral">&quot;Details follow.&quot;</span>);</div>
<div class="line"><a class="code hl_define" href="error_2error_8hpp.html#a019ee6e90802e444572dd78d312d6e23">FLOW_ERROR_SYS_ERROR_LOG_WARNING</a>();</div>
<div class="line"> </div>
<div class="line"><span class="comment">// Continue operating.  No assert(false); no std::abort()....</span></div>
<div class="ttc" id="aerror_2error_8hpp_html_a019ee6e90802e444572dd78d312d6e23"><div class="ttname"><a href="error_2error_8hpp.html#a019ee6e90802e444572dd78d312d6e23">FLOW_ERROR_SYS_ERROR_LOG_WARNING</a></div><div class="ttdeci">#define FLOW_ERROR_SYS_ERROR_LOG_WARNING()</div><div class="ttdoc">Logs a warning about the (often errno-based or from a library) error code in sys_err_code.</div><div class="ttdef"><b>Definition:</b> <a href="error_2error_8hpp_source.html#l00269">error.hpp:269</a></div></div>
<div class="ttc" id="alog_8hpp_html_a626c7dc4d3b4dc0b32a8aac8624d66bc"><div class="ttname"><a href="log_8hpp.html#a626c7dc4d3b4dc0b32a8aac8624d66bc">FLOW_LOG_WARNING</a></div><div class="ttdeci">#define FLOW_LOG_WARNING(ARG_stream_fragment)</div><div class="ttdoc">Logs a WARNING message into flow::log::Logger *get_logger() with flow::log::Component get_log_compone...</div><div class="ttdef"><b>Definition:</b> <a href="log_8hpp_source.html#l00152">log.hpp:152</a></div></div>
</div><!-- fragment --> 
<p class="definition">Definition at line <a class="el" href="error_2error_8hpp_source.html#l00269">269</a> of file <a class="el" href="error_2error_8hpp_source.html">error.hpp</a>.</p>

</div>
</div>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Fri Mar 28 2025 22:55:35 for Flow by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4
</small></address>
</body>
</html>
